// utils/session.js
// 会话管理工具

const { setStorage, getStorage, removeStorage } = require('./util.js')
const { post } = require('./api.js')

/**
 * 会话管理器
 */
class SessionManager {
  constructor() {
    this.tokenKey = 'userToken'
    this.refreshTokenKey = 'refreshToken'
    this.userInfoKey = 'userInfo'
    this.userProfileKey = 'userProfile'
    this.loginStatusKey = 'isLoggedIn'
    this.tokenExpiryKey = 'tokenExpiry'
    
    // 自动刷新token的时间间隔（毫秒）
    this.refreshInterval = 30 * 60 * 1000 // 30分钟
    this.refreshTimer = null
    
    this.init()
  }

  /**
   * 初始化会话管理器
   */
  init() {
    // 检查token是否即将过期
    this.checkTokenExpiry()
    
    // 启动定时刷新
    this.startAutoRefresh()
  }

  /**
   * 保存会话信息
   */
  saveSession(data) {
    const { token, refreshToken, userInfo, userProfile, expiresIn } = data
    
    // 计算token过期时间
    const expiryTime = Date.now() + (expiresIn * 1000)
    
    // 保存到本地存储
    setStorage(this.tokenKey, token)
    setStorage(this.refreshTokenKey, refreshToken)
    setStorage(this.userInfoKey, userInfo)
    setStorage(this.userProfileKey, userProfile || null)
    setStorage(this.loginStatusKey, true)
    setStorage(this.tokenExpiryKey, expiryTime)
    
    // 更新全局数据
    const app = getApp()
    if (app) {
      app.updateUserInfo(userInfo)
      app.updateUserProfile(userProfile)
    }
    
    // 重新启动自动刷新
    this.startAutoRefresh()
  }

  /**
   * 获取会话信息
   */
  getSession() {
    return {
      token: getStorage(this.tokenKey),
      refreshToken: getStorage(this.refreshTokenKey),
      userInfo: getStorage(this.userInfoKey),
      userProfile: getStorage(this.userProfileKey),
      isLoggedIn: getStorage(this.loginStatusKey),
      tokenExpiry: getStorage(this.tokenExpiryKey)
    }
  }

  /**
   * 清除会话信息
   */
  clearSession() {
    removeStorage(this.tokenKey)
    removeStorage(this.refreshTokenKey)
    removeStorage(this.userInfoKey)
    removeStorage(this.userProfileKey)
    removeStorage(this.loginStatusKey)
    removeStorage(this.tokenExpiryKey)
    
    // 清除全局数据
    const app = getApp()
    if (app) {
      app.clearUserData()
    }
    
    // 停止自动刷新
    this.stopAutoRefresh()
  }

  /**
   * 检查token是否有效
   */
  isTokenValid() {
    const token = getStorage(this.tokenKey)
    const expiry = getStorage(this.tokenExpiryKey)
    
    if (!token || !expiry) {
      return false
    }
    
    // 检查是否过期（提前5分钟判断为过期）
    return Date.now() < (expiry - 5 * 60 * 1000)
  }

  /**
   * 检查token过期时间
   */
  checkTokenExpiry() {
    const expiry = getStorage(this.tokenExpiryKey)
    
    if (expiry) {
      const timeUntilExpiry = expiry - Date.now()
      
      // 如果token在1小时内过期，尝试刷新
      if (timeUntilExpiry < 60 * 60 * 1000 && timeUntilExpiry > 0) {
        this.refreshToken()
      }
    }
  }

  /**
   * 刷新token
   */
  refreshToken() {
    const refreshToken = getStorage(this.refreshTokenKey)
    
    if (!refreshToken) {
      console.log('没有refresh token，无法刷新')
      return Promise.reject(new Error('没有refresh token'))
    }

    return post('/api/auth/refresh-token', {
      refreshToken
    }).then((data) => {
      // 更新token信息
      this.saveSession(data)
      console.log('Token刷新成功')
      return data
    }).catch((error) => {
      console.error('Token刷新失败:', error)
      // 刷新失败，清除会话
      this.clearSession()
      throw error
    })
  }

  /**
   * 启动自动刷新
   */
  startAutoRefresh() {
    this.stopAutoRefresh()
    
    this.refreshTimer = setInterval(() => {
      if (this.isTokenValid()) {
        this.checkTokenExpiry()
      } else {
        // token已过期，停止刷新
        this.stopAutoRefresh()
      }
    }, this.refreshInterval)
  }

  /**
   * 停止自动刷新
   */
  stopAutoRefresh() {
    if (this.refreshTimer) {
      clearInterval(this.refreshTimer)
      this.refreshTimer = null
    }
  }

  /**
   * 更新用户资料
   */
  updateUserProfile(userProfile) {
    setStorage(this.userProfileKey, userProfile)
    
    const app = getApp()
    if (app) {
      app.updateUserProfile(userProfile)
    }
  }

  /**
   * 获取用户信息
   */
  getUserInfo() {
    return getStorage(this.userInfoKey)
  }

  /**
   * 获取用户资料
   */
  getUserProfile() {
    return getStorage(this.userProfileKey)
  }

  /**
   * 检查是否登录
   */
  isLoggedIn() {
    return getStorage(this.loginStatusKey) && this.isTokenValid()
  }
}

// 创建全局会话管理器实例
const sessionManager = new SessionManager()

module.exports = {
  sessionManager,
  SessionManager
}